package QianFeng06.StringDemo;
/**
 * 在这方面运行速度快慢为：StringBuilder > StringBuffer > String
 * String为字符串常量，而StringBuilder和StringBuffer均为字符串变量，
 * 即String对象一旦创建之后该对象是不可更改的，但后两者的对象是变量，是可以更改的。
 *
 * String：适用于少量的字符串操作的情况
 * StringBuilder：适用于单线程下在字符缓冲区进行大量操作的情况
 * StringBuffer：适用多线程下在字符缓冲区进行大量操作的情况
 *
 * StringBuffer常用操作方法：
 *       方法名称                                                      描述
 * public StringBuffer()                                       构造一个空的StringBuffer对象
 * public StringBuffer(String str)                             将指定的String变为StringBuffer的内容
 * public StringBuffer(CharSequence seq)                       接收CharSequence接口的实例
 * public StringBuffer append(数据类型 b)                       提供了很多的append()方法，用于进行字符串连接
 * public StringBuffer delete(int start,int end)               删除指定位置的内容
 * public int indexOf(String str)                              字符串的查询功能
 * public StringBuffer insert(it ofe,数据类型b)                 在指定位置上增加一个内容
 * public StringBuffer replace(int start,int end,String str)   将指定范围的内容替换成其他内容
 * public String substring(int start,int end)                  截取指定范围的字符串
 * public String substring(int start)                          字符串截取
 * public StringBuffer reverse()                               字符串反转
 **/
public class StringBufferDemo {
    public static void main(String[] args) {
        /*String str="abc";
        2 System.out.println(str);
        3 str=str+"c";
        4 System.out.println(str);
        如果运行这段代码会发现先输出“ab”，然后又输出“abc”，好像是str这个对象被更改了，
        其实，这只是一种假象罢了，JVM对于这几行代码是这样处理的，
        首先创建一个String对象str，并把“ab”赋值给str，然后在第三行中，
        其实JVM又创建了一个新的对象也名为str，然后再把原来的str的值和“c”加起来再赋值给新的str，
        而原来的str就会被JVM的垃圾回收机制（GC）给回收掉了，所以，str实际上并没有被更改，
        也就是前面说的String对象一旦创建之后就不可更改了。
        所以，Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程，所以执行速度很慢。*/

        String a = "a";
        String b = "b";
        String c = a + b + 1;//a和b是变量对象
        System.out.println(c);//产生五个对象

        //StringBuffer目的是来解决字符串相加带来的性能问题（常量与变量）
        //StringBuffer的内容实现采用字符数组，默认数组长度为16，超过数组大小时，动态扩充的算法是原来长度*2+2
        //所以当我们预知要添加长度时，建议使用初始化容量的构造方法，来避免动态扩充的次数，从而提高效率
        //线程安全的，会影响性能
        StringBuffer stringBuffer = new StringBuffer(32);//带容量的构造（建议）
        stringBuffer.append(a).append(b).append(1);
        System.out.println(stringBuffer.toString());//只产生一个对象

        StringBuffer stringBuffer1 = new StringBuffer("abc");
        System.out.println(stringBuffer1.delete(0, 1).toString());
    }
}
